home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Experimental BBS Explossion 3
/
Experimental BBS Explossion III.iso
/
pascal
/
pkpas1.zip
/
MANUAL.DOC
< prev
next >
Wrap
Text File
|
1993-10-17
|
11KB
|
247 lines
Reference manual for PKWAREU version 1.0a October 1993
This manual contains information on all Procedures, functions and
declarations available for use, and discriptions on how to use
them.
===================== Functions and Procedures =============================
------------------------------------------------------------------------------
GetZipStats
------------------------------------------------------------------------------
Syntax:
FUNCTION GetZipStats:WORD;
Returns:
0 - if Signature found and successfully read into "zipstats".
1 - if Signature found does not match, the file is either not a
zip file or has been damaged.
2 - I do a block read to get the signature, returns 2 if it fails.
Other - higher then 2 are the IOResult errors, as defined
in your Turbo Pascal Reference.
Description:
Called after the "Zipfile" has been opened and assigned.
This procedure, finds the CentralFileHeaderSignature, and reads the
end of the central directory record into the global variable
"ZipStats". It also sets the CentralAddress variable to the
start of the central directory upon success.
NOTE Call this before the other routines, I do not
check to see if has been called successfully.
Programming notes:
Needs 50 bytes free on the heap before calling. This is
always restored, and it ain't asking for much.
-----------------------------------------------------------------------------
ReadFileHeader
-----------------------------------------------------------------------------
Syntax:
FUNCTION ReadFileHeader(VAR CFH: CentralFileHeaderType): Byte;
Returns:
0 - the read was successful contents of CFH should be Okay to use.
1 - Signature is bad do not use CHF, may have read past the last entry.
2 - disk read error, same as GetZipStats error 2 above.
Other - codes are IOResult codes as described above.
Description:
Called after a successful call to GetZipStats above. Loads the
CFH with the next Centralfileheader discovered. The read is
sequential. That is the directory is read from start to end, in
the order they appear. (This does not always correspond to the
order the files are actually stored in the zip file, however)
The Offset of the next header is kept in a four byte variable
internally, calculated at the time of the last read. This will
allow you to close the Zipfile and reopen it at anytime, but in
stating that... do not alter the ZipStats fields at anytime.
Programming notes:
Minimum heap use will be 46 bytes which is restored on exit of
the call. NOTE: that only the filename field is of type string,
FileComment is a character array. This is done because the length
discripter for each is a word type not a byte type. Meaning the
length of these fields is not limited to Pascal String lengths of
255. I have "capped" it to 255, set by the Const PKMaxLen. This
means if these fields are longer then PKMaxLen they will have to
be read by a different method unless you have the source code to
change PKMaxLen. This senario also applies to the filename field,
but should not be of concern for MS-DOS systems where the maximum
path length is less than 255 characters, or at least I think it is.
------------------------------------------------------------------------------
CFH_to_FileStat
------------------------------------------------------------------------------
Syntax:
PROCEDURE CFH_to_FileStat(VAR CFH: CentralFileHeaderType;
VAR FS: FileStats);
Description:
Converts a CentralFileHeaderType to a FileStats type. Included
because you will most likely write a similar routine to manage
the contents. CFH's are rather large to keep many in memory at one
time, so I suggest using this as it contians information of interest.
------------------------------------------------------------------------------
ShowZipComment
------------------------------------------------------------------------------
Synatx:
PROCEDURE ShowZipComment;
Description:
Writes the Zip comment to the screen. NOTE if you have the freeware
version only the first 15 charaters will write to screen. PKWARE
suggests a maximun size of a commment should be 64K.
------------------------------------------------------------------------------
GetZipComment
------------------------------------------------------------------------------
Syntax:
Procedure GetZipComment(VAR CPtr: CommentPtr; VAR Size:Word);
Description:
Returns a CommentPtr, as declered in types section, to a character
array, of length SIZE. You are responsible to free the heap
allocated to the pointer. Range checking must be off for this to
work. NOTE if you have the freeware version maximun size returned
is 15. PKWARE suggests a maximum size of a comment should be
64k, so WORD type is used for SIZE. Does not check if enough free
heap exists.
See PKdemo1 for details on correct use!
======================== Symbols, Types and Constants =========================
CONST
CentralFileHeaderSignature = $02014b50; { As defined by PKWARE }
CentralFileHeaderEndSignature = $06054b50;
PKMaxLen = 255; { Max length of Filecomment and ExtraField }
CommentLen = 15; { Set to 15 for freeware version }
TYPES
FString = String;
CharArray = Array[1.. PKMaxLen] of CHAR;
CommentPtr = ^CommentPtr;
CommentArray = Array[1..1] of Char;
=> FileStats = Record { just to make storage size managable }
Name : String[65]; { includes path }
OSize, { original size }
CSize, { compressed size }
Date, { date and time as longint }
CRC : Longint; { CRC-32 }
Attr : LongInt; { actually word TYPE in DOS }
Method : Word; { compression method used }
end;
=> ExtraData = Record
ExtraName : String[11]; { name of the data }
ExtraID : Word; { Id number of the data }
ExtraLen : Word; { length of the data }
ExtraAddress: Longint; { File offest of the data }
end;
NOTE: ExtraName is based on the value of ExtraID, first 31 mappings
are reserved by PKWARE, the rest can be used by a thrid parties.
I set ExtraName to one of :
$0007 = "AV Info"
$0009 = "OS/2"
$000C = "VAX/VMS"
other = "Proprietary" { third party assigned }
=> CentralFileHeaderType = Record { a.k.a. CFH }
CentralSig :LongInt; { Central dir signature }
Madeby : Word; { HI = Operating system,
Lo = Pkzip version }
VerReq : Word; { min PK version to extract }
GenPurp : Word; { Gen. purpose flag }
Compresion : Word; { Compersion method used }
lastFTime : Word; { Time of compression }
lastFdate : Word; { Date of compression }
crc32 : LongInt; { Magic number CRC32 }
Compsize : LongInt; { Compresed file size }
UnCompSize : LongInt; { Original file size }
NameLen : Word; { Length of the name }
Extralen : Word; { Length of extra field }
ComentLen : Word; { Length of comment }
DiskStart : Word; { # of disk which this file starts }
IntrenalAttr : Word; { LO set indicates ASCII text,
else is a binary file }
ExternalAttr : LongInt; { HI is operating sys dependant,
LO is MS-DOS file attr }
OffsetLocal : LongInt; { Offset from first disk of
local header }
FileName : FString; { Storage for filename, }
ExtraName : ExtraData; { Storage for extra field }
FileComment : CharArray; { Storage for File comments }
End;
NOTE: The CentralFileHeaderType is all the information about a stored file
available. Their should be one for each file stored.
=> ZipEndRec = Record
EndSig : LongInt; { Signature of Directroy End }
DiskNum : Word; { Number of this disk }
DiskwStart : Word; { # of disk with start of central dir }
NumEntries : Word; { # of entries in central dir.
on this disk }
TNumEntries : Word; { total number of entries in this
central dir. }
SizeCentral : LongInt; { Size of central directory }
OffsetDirRelDiskNum: LongInt; { Offest of central dir in respect to
starting disk number }
CommentLen :Word; { zipfile comment length }
end;
NOTE: The ZipEndRec is between the last CFH and the zip file comment,
only one in any zip file.
VAR's
ZipStats : ZipEndRec; { Global zipstats }
NOTE: This record is used internally, so do not change the fields once set
by calling GetZipStats.
ZipFile :File; { Zip filename.
NOTE: You open and assign and close it ! }
CentralAddress : LongInt; { Offset of Central directory in file }
{ Never change this! }
{ End manual.doc }